iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 18
0

前言

這幾天為了解bug花了我太多時間了,目前找的一個可能解法,但我還沒有時間實作...只好先來篇問題說明

設計內容

我用了一個標籤列控制器(Tab Bar Controller),共三個頁面:訂購頁面、購物車頁面、備註欄頁面。目標是從訂購頁面輸入數目,接著按下save,然後切換到購物車頁面只顯示選擇過的商品,未選擇的商品就不顯示。

bug說明

標籤列頁面沒問題,訂購頁面也沒問題,但是點選"茉莉綠茶" 10個,結果"珍珠 紅/綠/青/烏"居然也變成10個,回去改"茉莉綠茶"變成8個,結果又變成"珍珠奶茶(小顆)"8個...

我自己的理解原因是:我把 cell 裡面累加的動作存在 暫存記憶體裡,關鍵在於 iOS 會有 reUsable 的觀念!!

假設今天儲存格總共有23個,但是實際顯示時不可能23個先讀起來放,假設畫面只能顯示13個儲存格,那 iOS 也會預先讀取前後幾個儲存格起來備用(假設上下個3個),當使用者還沒開始往下滑動的時候,第17個儲存格是還沒寫入記憶體的。

可是當使用者繼續往下滑動,越上面的儲存格逐漸離開畫面,越下面的儲存格即將寫入記憶體, iOS 在處理上就會覆寫資料了,導致第1個儲存格的數字與第17個儲存格數字相同。

當然這之間有更多記憶體利用與釋放的問題(使用者停留位置,停留時間也會影響)。我沒深入研究了...

解法

唯一辦法當然是用陣列保存資料,一個蘿蔔一個坑,每個儲存格都給他一個資料位置儲存。但是這就要去判斷哪個 cell 被點選,而且不單單只是 cell 被點選,還要是 cell 裡面的按鈕...也因此 tableView(_:didSelectRowAt:) 這個方法是不適用的

網路上有的解法是利用使用者點擊位置來判定,但是萬一未來儲存格排序變更,或者尺寸大小變更,這樣後去管理很困難。

我目前是有找到一個解法,是利用自定義 delegate,但還沒實作...明天有成果在跟大家報告吧!!


上一篇
Day 17 - 展示控制器 (Split View Controller)
下一篇
Day19 - bug解除 (自定義 delegate 傳值:protocol應用)
系列文
無中生有-從SWIFT語法學習到iOS APP的開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ethan510010
iT邦新手 3 級 ‧ 2018-01-06 22:53:43

不確定這個是否也可以直接用Storyboard把tableViewCell的button拉到下一個頁面進行設定(我自己現在collectionView是這樣做的)。

soj iT邦新手 4 級 ‧ 2018-01-07 17:36:48 檢舉

單一cell 的按鈕是還可以用 segue 可以傳值
但是 table view 裡面很多個 cell,要確認哪個 cell 的按鈕被點的話,好像只能用 protocol 的方式確認

我要留言

立即登入留言